package UIlayer;
import CtrlLayer.*;

import java.util.Scanner;

public class VareUI
{
    private int id;
    private VareCtrl vareCtrl;
    private Scanner input;
    private static VareUI instance;

    /**
     * Constructor for objects of class VareUI
     */
    private VareUI()
    {
        vareCtrl = new VareCtrl();
        input = new Scanner(System.in);
    }

    /**
     * Danner en ny instans af VareUI, hvis en ikke eksistere, og retunere instansen
     * 
     * @return Den instans af VareUI, der burde være den eneste
     */
    public static VareUI getInstance()
    {
        if(instance == null)
        {
            instance = new VareUI();
        }
        return instance;
    }

    /**
     * Menuen hvorfra man interagere med vare klasserne
     */
    public void vareMenu()
    {
        boolean exit = false;
        int i = 0;
        while(!exit)
        {
            System.out.println("\n\n1. Tilføj vare \n2. Delete vare \n3. find vare\n");
            switch(getInt()){
                case -1:
                if(i > 10)
                {
                    fuckoff();
                    exit = true;
                    break;
                }
                System.out.println("enter whole number please ");
                i++;
                break;
                case 1:
                System.out.println("Tilføj vare:");
                addVare();
                break;
                case 2:
                System.out.println("Indtast vare navn");
                removeVare(input.nextLine());
                break;
                case 3:
                System.out.println("Indtast vare navn");
                System.out.println(findVare(input.nextLine()));
                break;
                default:
                System.out.println("bad choice");
                exit = true;
                break;
            }
        }
    }

    /**
     * Retunere næste indtastede int, eller -1 hvis det ikke er en int
     */
    private int getInt()
    {
        int choice = -1;
        if(input.hasNextInt())
        {
            choice = input.nextInt();
        }
        @SuppressWarnings("unused")
		String whatever = input.nextLine();
        return choice;
    }

    /**
     * Retunere næste indtastede double, eller -1 hvis det ikke er en double
     */
    private double getDouble()
    {
        double choice = -1;
        if(input.hasNextDouble())
        {
            choice = input.nextDouble();
        }
        @SuppressWarnings("unused")
		String whatever = input.nextLine();
        return choice;
    }

    /**
     * Retunere sandt hvis y indtastes, og falsk hvis ikke
     */
    private boolean yes()
    {
        boolean yes = false;
        if(input.next().toLowerCase().startsWith("y"))
        {
            yes = true;
        }
        return yes;
    }

    /**
     * En fin metode til de narhatte der er træls
     */
    private void fuckoff()
    {
        System.out.println("now look at what you did...");
        try
        {
            Thread.sleep(500);
        }
        catch(InterruptedException e){}
        for(int i = 0; i < 100; i++)
        {
            System.out.println("just enter a fucking NUMBER!");
            try
            {
                Thread.sleep(100);
            }
            catch(InterruptedException e){}
        }
    }

    /**
     * Opretter en vare og gemmer den, samler informationen via input
     */
    public void addVare()
    {
        String navn; String beskrivelse; double pris; double discount;
        System.out.println("indtast vare navn");
        navn = input.nextLine();
        System.out.println("indtast vare beskrivelse");
        beskrivelse = input.nextLine();
        System.out.println("indtast vare pris");
        pris = getDouble();
        while(pris < 0)
        {
            System.out.println("Dette system virker ikke til donationer, prøv igen");
            pris = getDouble();
        }
        System.out.println("indtast vare discount");
        discount = getDouble();
        while(discount > 20 || discount < 0)
        {
            if(discount > 20)
            {
                System.out.println("kan maks give 20% rabat, prøv igen");
            }
            if(discount < 0)
            {
                System.out.println("ændre prisen hvis den skal være højere, prøv igen");
            }
            discount = getDouble();
        }
        vareCtrl.addVare(navn, beskrivelse, pris, discount);
    }

    /**
     * aedre varen med det angivne navn, til de angivne data
     */
    public void setVare()
    {
        @SuppressWarnings("unused")
		String nytNavn; String navn; String beskrivelse; double pris; double discount;
        System.out.println("indtast navn på varen");
        navn = input.nextLine();
        while(findVare(navn) == null)
        {
            System.out.println("kunne ikke finde varen, prøv igen? Y/N");
            if(!yes())
            {
                return;
            }
            navn = input.nextLine();
        }
        System.out.println("indtast nyt vare navn, efterlad tom for ingen ændring");
        nytNavn = input.nextLine();
        System.out.println("indtast vare beskrivelse, efterlad tom for ingen ændring");
        beskrivelse = input.nextLine();
        System.out.println("indtast vare pris, efterlad tom for ingen ændring");
        pris = getDouble();
        while(pris < 0)
        {
            System.out.println("Dette system virker ikke til donationer, prøv igen");
            pris = getDouble();
        }
        System.out.println("indtast vare discount, efterlad tom for ingen ændring");
        discount = getDouble();
        while(discount > 20 || discount < 0)
        {
            if(discount > 20)
            {
                System.out.println("kan maks give 20% rabat, prøv igen");
            }
            if(discount < 0)
            {
                System.out.println("det er hvad afgifter er til for, prøv igen");
            }
            discount = getDouble();
        }
        vareCtrl.setVare(navn,beskrivelse,pris,discount);
    }

    /**
     * Sletter varen med det angivne navn, hvis den kan findes
     */
    public void removeVare(String navn)
    {
        while(findVare(navn) == null)
        {
            System.out.println("kunne ikke finde varen, prøv igen? Y/N");
            if(!yes())
            {
                return;
            }
            navn = input.nextLine();
        }
        vareCtrl.removeVare(navn);
    }

    /**
     * Retunere en streng med information om varen med det angivne navn
     * 
     * @return Streng med inforamtioner om varen
     */
    public String findVare(String navn)
    {
        String vare = null;
        if(navn != null)
        {
            try
            {
                vare = vareCtrl.findVare(navn, 0).toString();
            }
            catch(NullPointerException e)
            {
                System.out.println("fandt ikke varen, prøv igen:");
                vare = findVare(input.nextLine());
            }
        }
        return vare;
    }
    
    public int inputID()
    {
        return id;
    }
}
